package com.hello.simple;

import com.Constants;
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.Exchange;
import org.springframework.amqp.core.FanoutExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.rabbit.annotation.EnableRabbit;
import org.springframework.amqp.rabbit.config.SimpleRabbitListenerContainerFactory;
import org.springframework.amqp.rabbit.connection.CachingConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitAdmin;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@ComponentScan("com.hello.simple")
public class HelloSimpleMqConfiguration {


    @Bean
    public CachingConnectionFactory connectionFactory() {
        return new CachingConnectionFactory("localhost");
    }
    /**
     * 添加此管理bean用来实现队列,交换机,绑定等的注册
     * 在RabbitAdmin类的afterProperties方法中有调用initialize方法,此方法可以看到怎么注册队列,交换机,绑定等
     *
     * 在afterProperties中，它没有直接处理交换机、队列等的注册，而是给ConnectionFactory注册了一个
     * ConnectionListener,而在这个监听器中才调用了initialize方法，所以在ConnectionFactory创建连接的
     * 时候才会让监听器得到执行，因而才会完成队列、交换机、绑定的注册处理，而RabbitTemplate的convertAndSend
     * 方法会导致连接的创建，所以在项目启动时，如果没有任何连接的创建动作，队列、交换机这些是不会注册的，
     * 只有在有导致连接创建的行为发生时才会完成注册，比如利用RabbitTemplate发送消息
     * @return
     */
    @Bean
    public RabbitAdmin amqpAdmin() {
        return new RabbitAdmin(connectionFactory());
    }

    @Bean
    public Queue myQueue() {
        return new Queue(Constants.QUEUE_NAME);
    }

    @Bean
    public RabbitTemplate rabbitTemplate() {
        return new RabbitTemplate(connectionFactory());
    }
}
